Plot salinity with depth averaged velocity vectors¶

Combine the salinity color plot with velocity vectors

In [1]:
%load_ext autoreload
%autoreload 2
In [2]:
import numpy as np
import pandas as pd
import xarray as xr
#
from schimpy import schism_mesh
# viz
import hvplot.pandas
import hvplot.xarray
import holoviews as hv
from holoviews import opts,dim
hv.extension('bokeh')
# widgets
import panel as pn
pn.extension()
In [3]:
# for advanced viz ops
import datashader
import holoviews.operation.datashader as hd
from holoviews.operation.datashader import datashade, rasterize
import warnings
warnings.filterwarnings('ignore')

Open the data sets¶

In [4]:
varname = 'salinity'
In [5]:
dsv = xr.open_mfdataset('../tests/data/m1_hello_schism/outputs/out2d_*.nc', concat_dim='time', combine="nested",
                  data_vars='minimal', coords='minimal', compat='override')
dsv
Out[5]:
<xarray.Dataset>
Dimensions:                  (time: 144, one: 1, nSCHISM_hgrid_node: 2639,
                              nSCHISM_hgrid_face: 4636,
                              nSCHISM_hgrid_edge: 7274,
                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2)
Coordinates:
  * time                     (time) datetime64[ns] 1999-12-31T16:20:00 ... 20...
    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 dask.array<chunksize=(2639,), meta=np.ndarray>
    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 dask.array<chunksize=(2639,), meta=np.ndarray>
    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 dask.array<chunksize=(4636,), meta=np.ndarray>
    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 dask.array<chunksize=(4636,), meta=np.ndarray>
    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 dask.array<chunksize=(7274,), meta=np.ndarray>
    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 dask.array<chunksize=(7274,), meta=np.ndarray>
Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,
                                nSCHISM_hgrid_edge,
                                nMaxSCHISM_hgrid_face_nodes, two
Data variables:
    minimum_depth            (one) float64 dask.array<chunksize=(1,), meta=np.ndarray>
    SCHISM_hgrid             (one) |S1 dask.array<chunksize=(1,), meta=np.ndarray>
    depth                    (nSCHISM_hgrid_node) float32 dask.array<chunksize=(2639,), meta=np.ndarray>
    bottom_index_node        (nSCHISM_hgrid_node) int32 dask.array<chunksize=(2639,), meta=np.ndarray>
    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 dask.array<chunksize=(4636, 4), meta=np.ndarray>
    SCHISM_hgrid_edge_nodes  (nSCHISM_hgrid_edge, two) float64 dask.array<chunksize=(7274, 2), meta=np.ndarray>
    dryFlagNode              (time, nSCHISM_hgrid_node) float32 dask.array<chunksize=(72, 2639), meta=np.ndarray>
    elevation                (time, nSCHISM_hgrid_node) float32 dask.array<chunksize=(72, 2639), meta=np.ndarray>
    depthAverageVelX         (time, nSCHISM_hgrid_node) float32 dask.array<chunksize=(72, 2639), meta=np.ndarray>
    depthAverageVelY         (time, nSCHISM_hgrid_node) float32 dask.array<chunksize=(72, 2639), meta=np.ndarray>
    dryFlagElement           (time, nSCHISM_hgrid_face) float32 dask.array<chunksize=(72, 4636), meta=np.ndarray>
    dryFlagSide              (time, nSCHISM_hgrid_edge) float32 dask.array<chunksize=(72, 7274), meta=np.ndarray>
xarray.Dataset
    • time: 144
    • one: 1
    • nSCHISM_hgrid_node: 2639
    • nSCHISM_hgrid_face: 4636
    • nSCHISM_hgrid_edge: 7274
    • nMaxSCHISM_hgrid_face_nodes: 4
    • two: 2
    • time
      (time)
      datetime64[ns]
      1999-12-31T16:20:00 ... 2000-01-...
      i23d :
      0
      base_date :
      2000 1 1 0.00 8.00
      standard_name :
      time
      axis :
      T
      array(['1999-12-31T16:20:00.000000000', '1999-12-31T16:40:00.000000000',
             '1999-12-31T17:00:00.000000000', '1999-12-31T17:20:00.000000000',
             '1999-12-31T17:40:00.000000000', '1999-12-31T18:00:00.000000000',
             '1999-12-31T18:20:00.000000000', '1999-12-31T18:40:00.000000000',
             '1999-12-31T19:00:00.000000000', '1999-12-31T19:20:00.000000000',
             '1999-12-31T19:40:00.000000000', '1999-12-31T20:00:00.000000000',
             '1999-12-31T20:20:00.000000000', '1999-12-31T20:40:00.000000000',
             '1999-12-31T21:00:00.000000000', '1999-12-31T21:20:00.000000000',
             '1999-12-31T21:40:00.000000000', '1999-12-31T22:00:00.000000000',
             '1999-12-31T22:20:00.000000000', '1999-12-31T22:40:00.000000000',
             '1999-12-31T23:00:00.000000000', '1999-12-31T23:20:00.000000000',
             '1999-12-31T23:40:00.000000000', '2000-01-01T00:00:00.000000000',
             '2000-01-01T00:20:00.000000000', '2000-01-01T00:40:00.000000000',
             '2000-01-01T01:00:00.000000000', '2000-01-01T01:20:00.000000000',
             '2000-01-01T01:40:00.000000000', '2000-01-01T02:00:00.000000000',
             '2000-01-01T02:20:00.000000000', '2000-01-01T02:40:00.000000000',
             '2000-01-01T03:00:00.000000000', '2000-01-01T03:20:00.000000000',
             '2000-01-01T03:40:00.000000000', '2000-01-01T04:00:00.000000000',
             '2000-01-01T04:20:00.000000000', '2000-01-01T04:40:00.000000000',
             '2000-01-01T05:00:00.000000000', '2000-01-01T05:20:00.000000000',
             '2000-01-01T05:40:00.000000000', '2000-01-01T06:00:00.000000000',
             '2000-01-01T06:20:00.000000000', '2000-01-01T06:40:00.000000000',
             '2000-01-01T07:00:00.000000000', '2000-01-01T07:20:00.000000000',
             '2000-01-01T07:40:00.000000000', '2000-01-01T08:00:00.000000000',
             '2000-01-01T08:20:00.000000000', '2000-01-01T08:40:00.000000000',
             '2000-01-01T09:00:00.000000000', '2000-01-01T09:20:00.000000000',
             '2000-01-01T09:40:00.000000000', '2000-01-01T10:00:00.000000000',
             '2000-01-01T10:20:00.000000000', '2000-01-01T10:40:00.000000000',
             '2000-01-01T11:00:00.000000000', '2000-01-01T11:20:00.000000000',
             '2000-01-01T11:40:00.000000000', '2000-01-01T12:00:00.000000000',
             '2000-01-01T12:20:00.000000000', '2000-01-01T12:40:00.000000000',
             '2000-01-01T13:00:00.000000000', '2000-01-01T13:20:00.000000000',
             '2000-01-01T13:40:00.000000000', '2000-01-01T14:00:00.000000000',
             '2000-01-01T14:20:00.000000000', '2000-01-01T14:40:00.000000000',
             '2000-01-01T15:00:00.000000000', '2000-01-01T15:20:00.000000000',
             '2000-01-01T15:40:00.000000000', '2000-01-01T16:00:00.000000000',
             '2000-01-01T16:20:00.000000000', '2000-01-01T16:40:00.000000000',
             '2000-01-01T17:00:00.000000000', '2000-01-01T17:20:00.000000000',
             '2000-01-01T17:40:00.000000000', '2000-01-01T18:00:00.000000000',
             '2000-01-01T18:20:00.000000000', '2000-01-01T18:40:00.000000000',
             '2000-01-01T19:00:00.000000000', '2000-01-01T19:20:00.000000000',
             '2000-01-01T19:40:00.000000000', '2000-01-01T20:00:00.000000000',
             '2000-01-01T20:20:00.000000000', '2000-01-01T20:40:00.000000000',
             '2000-01-01T21:00:00.000000000', '2000-01-01T21:20:00.000000000',
             '2000-01-01T21:40:00.000000000', '2000-01-01T22:00:00.000000000',
             '2000-01-01T22:20:00.000000000', '2000-01-01T22:40:00.000000000',
             '2000-01-01T23:00:00.000000000', '2000-01-01T23:20:00.000000000',
             '2000-01-01T23:40:00.000000000', '2000-01-02T00:00:00.000000000',
             '2000-01-02T00:20:00.000000000', '2000-01-02T00:40:00.000000000',
             '2000-01-02T01:00:00.000000000', '2000-01-02T01:20:00.000000000',
             '2000-01-02T01:40:00.000000000', '2000-01-02T02:00:00.000000000',
             '2000-01-02T02:20:00.000000000', '2000-01-02T02:40:00.000000000',
             '2000-01-02T03:00:00.000000000', '2000-01-02T03:20:00.000000000',
             '2000-01-02T03:40:00.000000000', '2000-01-02T04:00:00.000000000',
             '2000-01-02T04:20:00.000000000', '2000-01-02T04:40:00.000000000',
             '2000-01-02T05:00:00.000000000', '2000-01-02T05:20:00.000000000',
             '2000-01-02T05:40:00.000000000', '2000-01-02T06:00:00.000000000',
             '2000-01-02T06:20:00.000000000', '2000-01-02T06:40:00.000000000',
             '2000-01-02T07:00:00.000000000', '2000-01-02T07:20:00.000000000',
             '2000-01-02T07:40:00.000000000', '2000-01-02T08:00:00.000000000',
             '2000-01-02T08:20:00.000000000', '2000-01-02T08:40:00.000000000',
             '2000-01-02T09:00:00.000000000', '2000-01-02T09:20:00.000000000',
             '2000-01-02T09:40:00.000000000', '2000-01-02T10:00:00.000000000',
             '2000-01-02T10:20:00.000000000', '2000-01-02T10:40:00.000000000',
             '2000-01-02T11:00:00.000000000', '2000-01-02T11:20:00.000000000',
             '2000-01-02T11:40:00.000000000', '2000-01-02T12:00:00.000000000',
             '2000-01-02T12:20:00.000000000', '2000-01-02T12:40:00.000000000',
             '2000-01-02T13:00:00.000000000', '2000-01-02T13:20:00.000000000',
             '2000-01-02T13:40:00.000000000', '2000-01-02T14:00:00.000000000',
             '2000-01-02T14:20:00.000000000', '2000-01-02T14:40:00.000000000',
             '2000-01-02T15:00:00.000000000', '2000-01-02T15:20:00.000000000',
             '2000-01-02T15:40:00.000000000', '2000-01-02T16:00:00.000000000'],
            dtype='datetime64[ns]')
    • SCHISM_hgrid_node_x
      (nSCHISM_hgrid_node)
      float64
      dask.array<chunksize=(2639,), meta=np.ndarray>
      axis :
      X
      location :
      node
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_x_coordinate
      Array Chunk
      Bytes 20.62 kiB 20.62 kiB
      Shape (2639,) (2639,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      2639 1
    • SCHISM_hgrid_node_y
      (nSCHISM_hgrid_node)
      float64
      dask.array<chunksize=(2639,), meta=np.ndarray>
      axis :
      Y
      location :
      node
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_y_coordinate
      Array Chunk
      Bytes 20.62 kiB 20.62 kiB
      Shape (2639,) (2639,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      2639 1
    • SCHISM_hgrid_face_x
      (nSCHISM_hgrid_face)
      float64
      dask.array<chunksize=(4636,), meta=np.ndarray>
      axis :
      X
      location :
      face
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_x_coordinate
      Array Chunk
      Bytes 36.22 kiB 36.22 kiB
      Shape (4636,) (4636,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      4636 1
    • SCHISM_hgrid_face_y
      (nSCHISM_hgrid_face)
      float64
      dask.array<chunksize=(4636,), meta=np.ndarray>
      axis :
      Y
      location :
      face
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_y_coordinate
      Array Chunk
      Bytes 36.22 kiB 36.22 kiB
      Shape (4636,) (4636,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      4636 1
    • SCHISM_hgrid_edge_x
      (nSCHISM_hgrid_edge)
      float64
      dask.array<chunksize=(7274,), meta=np.ndarray>
      axis :
      X
      location :
      edge
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_x_coordinate
      Array Chunk
      Bytes 56.83 kiB 56.83 kiB
      Shape (7274,) (7274,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      7274 1
    • SCHISM_hgrid_edge_y
      (nSCHISM_hgrid_edge)
      float64
      dask.array<chunksize=(7274,), meta=np.ndarray>
      axis :
      Y
      location :
      edge
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_y_coordinate
      Array Chunk
      Bytes 56.83 kiB 56.83 kiB
      Shape (7274,) (7274,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      7274 1
    • minimum_depth
      (one)
      float64
      dask.array<chunksize=(1,), meta=np.ndarray>
      units :
      m
      Array Chunk
      Bytes 8 B 8 B
      Shape (1,) (1,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      1 1
    • SCHISM_hgrid
      (one)
      |S1
      dask.array<chunksize=(1,), meta=np.ndarray>
      long_name :
      Topology data of 2d unstructured mesh
      topology_dimension :
      2
      cf_role :
      mesh_topology
      node_coordinates :
      SCHISM_hgrid_node_x SCHISM_hgrid_node_y
      edge_coordinates :
      SCHISM_hgrid_edge_x SCHISM_hgrid_edge_y
      face_coordinates :
      SCHISM_hgrid_face_x SCHISM_hgrid_face_y
      edge_node_connectivity :
      SCHISM_hgrid_edge_nodes
      face_node_connectivity :
      SCHISM_hgrid_face_nodes
      Array Chunk
      Bytes 1 B 1 B
      Shape (1,) (1,)
      Dask graph 1 chunks in 2 graph layers
      Data type |S1 numpy.ndarray
      1 1
    • depth
      (nSCHISM_hgrid_node)
      float32
      dask.array<chunksize=(2639,), meta=np.ndarray>
      units :
      m
      axis :
      Z
      positive :
      down
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 10.31 kiB 10.31 kiB
      Shape (2639,) (2639,)
      Dask graph 1 chunks in 2 graph layers
      Data type float32 numpy.ndarray
      2639 1
    • bottom_index_node
      (nSCHISM_hgrid_node)
      int32
      dask.array<chunksize=(2639,), meta=np.ndarray>
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 10.31 kiB 10.31 kiB
      Shape (2639,) (2639,)
      Dask graph 1 chunks in 2 graph layers
      Data type int32 numpy.ndarray
      2639 1
    • SCHISM_hgrid_face_nodes
      (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes)
      float64
      dask.array<chunksize=(4636, 4), meta=np.ndarray>
      start_index :
      1
      cf_role :
      face_node_connectivity
      Array Chunk
      Bytes 144.88 kiB 144.88 kiB
      Shape (4636, 4) (4636, 4)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      4 4636
    • SCHISM_hgrid_edge_nodes
      (nSCHISM_hgrid_edge, two)
      float64
      dask.array<chunksize=(7274, 2), meta=np.ndarray>
      start_index :
      1
      cf_role :
      edge_node_connectivity
      Array Chunk
      Bytes 113.66 kiB 113.66 kiB
      Shape (7274, 2) (7274, 2)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      2 7274
    • dryFlagNode
      (time, nSCHISM_hgrid_node)
      float32
      dask.array<chunksize=(72, 2639), meta=np.ndarray>
      i23d :
      1
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 1.45 MiB 742.22 kiB
      Shape (144, 2639) (72, 2639)
      Dask graph 2 chunks in 5 graph layers
      Data type float32 numpy.ndarray
      2639 144
    • elevation
      (time, nSCHISM_hgrid_node)
      float32
      dask.array<chunksize=(72, 2639), meta=np.ndarray>
      i23d :
      1
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 1.45 MiB 742.22 kiB
      Shape (144, 2639) (72, 2639)
      Dask graph 2 chunks in 5 graph layers
      Data type float32 numpy.ndarray
      2639 144
    • depthAverageVelX
      (time, nSCHISM_hgrid_node)
      float32
      dask.array<chunksize=(72, 2639), meta=np.ndarray>
      i23d :
      1
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 1.45 MiB 742.22 kiB
      Shape (144, 2639) (72, 2639)
      Dask graph 2 chunks in 5 graph layers
      Data type float32 numpy.ndarray
      2639 144
    • depthAverageVelY
      (time, nSCHISM_hgrid_node)
      float32
      dask.array<chunksize=(72, 2639), meta=np.ndarray>
      i23d :
      1
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 1.45 MiB 742.22 kiB
      Shape (144, 2639) (72, 2639)
      Dask graph 2 chunks in 5 graph layers
      Data type float32 numpy.ndarray
      2639 144
    • dryFlagElement
      (time, nSCHISM_hgrid_face)
      float32
      dask.array<chunksize=(72, 4636), meta=np.ndarray>
      i23d :
      4
      location :
      face
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 2.55 MiB 1.27 MiB
      Shape (144, 4636) (72, 4636)
      Dask graph 2 chunks in 5 graph layers
      Data type float32 numpy.ndarray
      4636 144
    • dryFlagSide
      (time, nSCHISM_hgrid_edge)
      float32
      dask.array<chunksize=(72, 7274), meta=np.ndarray>
      i23d :
      7
      location :
      edge
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 4.00 MiB 2.00 MiB
      Shape (144, 7274) (72, 7274)
      Dask graph 2 chunks in 5 graph layers
      Data type float32 numpy.ndarray
      7274 144
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['1999-12-31 16:20:00', '1999-12-31 16:40:00',
                     '1999-12-31 17:00:00', '1999-12-31 17:20:00',
                     '1999-12-31 17:40:00', '1999-12-31 18:00:00',
                     '1999-12-31 18:20:00', '1999-12-31 18:40:00',
                     '1999-12-31 19:00:00', '1999-12-31 19:20:00',
                     ...
                     '2000-01-02 13:00:00', '2000-01-02 13:20:00',
                     '2000-01-02 13:40:00', '2000-01-02 14:00:00',
                     '2000-01-02 14:20:00', '2000-01-02 14:40:00',
                     '2000-01-02 15:00:00', '2000-01-02 15:20:00',
                     '2000-01-02 15:40:00', '2000-01-02 16:00:00'],
                    dtype='datetime64[ns]', name='time', length=144, freq=None))
In [6]:
ds = xr.open_mfdataset(f'../tests/data/m1_hello_schism/outputs/{varname}_*.nc', concat_dim='time', combine="nested",
                  data_vars='minimal', coords='minimal', compat='override')
ds
Out[6]:
<xarray.Dataset>
Dimensions:   (time: 144, nSCHISM_hgrid_node: 2639, nSCHISM_vgrid_layers: 11)
Coordinates:
  * time      (time) datetime64[ns] 1999-12-31T16:20:00 ... 2000-01-02T16:00:00
Dimensions without coordinates: nSCHISM_hgrid_node, nSCHISM_vgrid_layers
Data variables:
    salinity  (time, nSCHISM_hgrid_node, nSCHISM_vgrid_layers) float32 dask.array<chunksize=(72, 2639, 11), meta=np.ndarray>
xarray.Dataset
    • time: 144
    • nSCHISM_hgrid_node: 2639
    • nSCHISM_vgrid_layers: 11
    • time
      (time)
      datetime64[ns]
      1999-12-31T16:20:00 ... 2000-01-...
      i23d :
      0
      base_date :
      2000 1 1 0.00 8.00
      standard_name :
      time
      axis :
      T
      array(['1999-12-31T16:20:00.000000000', '1999-12-31T16:40:00.000000000',
             '1999-12-31T17:00:00.000000000', '1999-12-31T17:20:00.000000000',
             '1999-12-31T17:40:00.000000000', '1999-12-31T18:00:00.000000000',
             '1999-12-31T18:20:00.000000000', '1999-12-31T18:40:00.000000000',
             '1999-12-31T19:00:00.000000000', '1999-12-31T19:20:00.000000000',
             '1999-12-31T19:40:00.000000000', '1999-12-31T20:00:00.000000000',
             '1999-12-31T20:20:00.000000000', '1999-12-31T20:40:00.000000000',
             '1999-12-31T21:00:00.000000000', '1999-12-31T21:20:00.000000000',
             '1999-12-31T21:40:00.000000000', '1999-12-31T22:00:00.000000000',
             '1999-12-31T22:20:00.000000000', '1999-12-31T22:40:00.000000000',
             '1999-12-31T23:00:00.000000000', '1999-12-31T23:20:00.000000000',
             '1999-12-31T23:40:00.000000000', '2000-01-01T00:00:00.000000000',
             '2000-01-01T00:20:00.000000000', '2000-01-01T00:40:00.000000000',
             '2000-01-01T01:00:00.000000000', '2000-01-01T01:20:00.000000000',
             '2000-01-01T01:40:00.000000000', '2000-01-01T02:00:00.000000000',
             '2000-01-01T02:20:00.000000000', '2000-01-01T02:40:00.000000000',
             '2000-01-01T03:00:00.000000000', '2000-01-01T03:20:00.000000000',
             '2000-01-01T03:40:00.000000000', '2000-01-01T04:00:00.000000000',
             '2000-01-01T04:20:00.000000000', '2000-01-01T04:40:00.000000000',
             '2000-01-01T05:00:00.000000000', '2000-01-01T05:20:00.000000000',
             '2000-01-01T05:40:00.000000000', '2000-01-01T06:00:00.000000000',
             '2000-01-01T06:20:00.000000000', '2000-01-01T06:40:00.000000000',
             '2000-01-01T07:00:00.000000000', '2000-01-01T07:20:00.000000000',
             '2000-01-01T07:40:00.000000000', '2000-01-01T08:00:00.000000000',
             '2000-01-01T08:20:00.000000000', '2000-01-01T08:40:00.000000000',
             '2000-01-01T09:00:00.000000000', '2000-01-01T09:20:00.000000000',
             '2000-01-01T09:40:00.000000000', '2000-01-01T10:00:00.000000000',
             '2000-01-01T10:20:00.000000000', '2000-01-01T10:40:00.000000000',
             '2000-01-01T11:00:00.000000000', '2000-01-01T11:20:00.000000000',
             '2000-01-01T11:40:00.000000000', '2000-01-01T12:00:00.000000000',
             '2000-01-01T12:20:00.000000000', '2000-01-01T12:40:00.000000000',
             '2000-01-01T13:00:00.000000000', '2000-01-01T13:20:00.000000000',
             '2000-01-01T13:40:00.000000000', '2000-01-01T14:00:00.000000000',
             '2000-01-01T14:20:00.000000000', '2000-01-01T14:40:00.000000000',
             '2000-01-01T15:00:00.000000000', '2000-01-01T15:20:00.000000000',
             '2000-01-01T15:40:00.000000000', '2000-01-01T16:00:00.000000000',
             '2000-01-01T16:20:00.000000000', '2000-01-01T16:40:00.000000000',
             '2000-01-01T17:00:00.000000000', '2000-01-01T17:20:00.000000000',
             '2000-01-01T17:40:00.000000000', '2000-01-01T18:00:00.000000000',
             '2000-01-01T18:20:00.000000000', '2000-01-01T18:40:00.000000000',
             '2000-01-01T19:00:00.000000000', '2000-01-01T19:20:00.000000000',
             '2000-01-01T19:40:00.000000000', '2000-01-01T20:00:00.000000000',
             '2000-01-01T20:20:00.000000000', '2000-01-01T20:40:00.000000000',
             '2000-01-01T21:00:00.000000000', '2000-01-01T21:20:00.000000000',
             '2000-01-01T21:40:00.000000000', '2000-01-01T22:00:00.000000000',
             '2000-01-01T22:20:00.000000000', '2000-01-01T22:40:00.000000000',
             '2000-01-01T23:00:00.000000000', '2000-01-01T23:20:00.000000000',
             '2000-01-01T23:40:00.000000000', '2000-01-02T00:00:00.000000000',
             '2000-01-02T00:20:00.000000000', '2000-01-02T00:40:00.000000000',
             '2000-01-02T01:00:00.000000000', '2000-01-02T01:20:00.000000000',
             '2000-01-02T01:40:00.000000000', '2000-01-02T02:00:00.000000000',
             '2000-01-02T02:20:00.000000000', '2000-01-02T02:40:00.000000000',
             '2000-01-02T03:00:00.000000000', '2000-01-02T03:20:00.000000000',
             '2000-01-02T03:40:00.000000000', '2000-01-02T04:00:00.000000000',
             '2000-01-02T04:20:00.000000000', '2000-01-02T04:40:00.000000000',
             '2000-01-02T05:00:00.000000000', '2000-01-02T05:20:00.000000000',
             '2000-01-02T05:40:00.000000000', '2000-01-02T06:00:00.000000000',
             '2000-01-02T06:20:00.000000000', '2000-01-02T06:40:00.000000000',
             '2000-01-02T07:00:00.000000000', '2000-01-02T07:20:00.000000000',
             '2000-01-02T07:40:00.000000000', '2000-01-02T08:00:00.000000000',
             '2000-01-02T08:20:00.000000000', '2000-01-02T08:40:00.000000000',
             '2000-01-02T09:00:00.000000000', '2000-01-02T09:20:00.000000000',
             '2000-01-02T09:40:00.000000000', '2000-01-02T10:00:00.000000000',
             '2000-01-02T10:20:00.000000000', '2000-01-02T10:40:00.000000000',
             '2000-01-02T11:00:00.000000000', '2000-01-02T11:20:00.000000000',
             '2000-01-02T11:40:00.000000000', '2000-01-02T12:00:00.000000000',
             '2000-01-02T12:20:00.000000000', '2000-01-02T12:40:00.000000000',
             '2000-01-02T13:00:00.000000000', '2000-01-02T13:20:00.000000000',
             '2000-01-02T13:40:00.000000000', '2000-01-02T14:00:00.000000000',
             '2000-01-02T14:20:00.000000000', '2000-01-02T14:40:00.000000000',
             '2000-01-02T15:00:00.000000000', '2000-01-02T15:20:00.000000000',
             '2000-01-02T15:40:00.000000000', '2000-01-02T16:00:00.000000000'],
            dtype='datetime64[ns]')
    • salinity
      (time, nSCHISM_hgrid_node, nSCHISM_vgrid_layers)
      float32
      dask.array<chunksize=(72, 2639, 11), meta=np.ndarray>
      i23d :
      2
      coordinates :
      SCHISM_hgrid_node_x SCHISM_hgrid_node_y
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 15.95 MiB 7.97 MiB
      Shape (144, 2639, 11) (72, 2639, 11)
      Dask graph 2 chunks in 5 graph layers
      Data type float32 numpy.ndarray
      11 2639 144
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['1999-12-31 16:20:00', '1999-12-31 16:40:00',
                     '1999-12-31 17:00:00', '1999-12-31 17:20:00',
                     '1999-12-31 17:40:00', '1999-12-31 18:00:00',
                     '1999-12-31 18:20:00', '1999-12-31 18:40:00',
                     '1999-12-31 19:00:00', '1999-12-31 19:20:00',
                     ...
                     '2000-01-02 13:00:00', '2000-01-02 13:20:00',
                     '2000-01-02 13:40:00', '2000-01-02 14:00:00',
                     '2000-01-02 14:20:00', '2000-01-02 14:40:00',
                     '2000-01-02 15:00:00', '2000-01-02 15:20:00',
                     '2000-01-02 15:40:00', '2000-01-02 16:00:00'],
                    dtype='datetime64[ns]', name='time', length=144, freq=None))

Read mesh information¶

In [7]:
smesh = schism_mesh.read_mesh('../tests/data/m1_hello_schism/hgrid.gr3')
In [8]:
smesh.n_nodes(), smesh.n_edges(), smesh.n_elems()
Out[8]:
(2639, 7274, 4636)
In [9]:
nodes = pd.DataFrame(smesh.nodes,columns=['x','y','z'])
nodes
nodes[varname] = ds[varname].values[0,:,0]
In [10]:
trimesh = hv.TriMesh((smesh.elems, hv.Points(nodes, vdims=varname)))
In [11]:
trimesh = trimesh.opts(
    opts.TriMesh(cmap='rainbow4', cnorm='eq_hist', colorbar=True, node_alpha=0, edge_alpha=0, edge_color=varname, filled=True, height=400, 
                 inspection_policy='edges', tools=['hover'], width=400))
In [12]:
trimesh.nodes.data
Out[12]:
x y index z salinity
0 56000.00 -10400.00 0 0.500000 3.364312e-02
1 55831.58 -10400.00 1 0.500000 1.095413e-02
2 56000.00 -10350.00 2 0.944444 2.154961e-02
3 55663.16 -10400.00 3 0.500000 2.462938e-08
4 55831.58 -10348.07 4 1.023290 5.119039e-03
... ... ... ... ... ...
2634 55831.58 10348.07 2634 1.023290 5.119046e-03
2635 55663.16 10400.00 2635 0.500000 2.464225e-08
2636 56000.00 10350.00 2636 0.944444 2.154963e-02
2637 55831.58 10400.00 2637 0.500000 1.095410e-02
2638 56000.00 10400.00 2638 0.500000 3.364312e-02

2639 rows × 5 columns

Calculate velocity vectors from depth averaged X and Y velocity vectors¶

In [13]:
vmag = np.sqrt(dsv.depthAverageVelX**2+dsv.depthAverageVelY**2)
vangle = np.arctan2(dsv.depthAverageVelY,dsv.depthAverageVelX)
vel = xr.Dataset({'mag':vmag,'angle': vangle})
vel## Calculate velocity vectors from depth averaged X and Y velocity vectors
Out[13]:
<xarray.Dataset>
Dimensions:              (time: 144, nSCHISM_hgrid_node: 2639)
Coordinates:
  * time                 (time) datetime64[ns] 1999-12-31T16:20:00 ... 2000-0...
    SCHISM_hgrid_node_x  (nSCHISM_hgrid_node) float64 dask.array<chunksize=(2639,), meta=np.ndarray>
    SCHISM_hgrid_node_y  (nSCHISM_hgrid_node) float64 dask.array<chunksize=(2639,), meta=np.ndarray>
Dimensions without coordinates: nSCHISM_hgrid_node
Data variables:
    mag                  (time, nSCHISM_hgrid_node) float32 dask.array<chunksize=(72, 2639), meta=np.ndarray>
    angle                (time, nSCHISM_hgrid_node) float32 dask.array<chunksize=(72, 2639), meta=np.ndarray>
xarray.Dataset
    • time: 144
    • nSCHISM_hgrid_node: 2639
    • time
      (time)
      datetime64[ns]
      1999-12-31T16:20:00 ... 2000-01-...
      i23d :
      0
      base_date :
      2000 1 1 0.00 8.00
      standard_name :
      time
      axis :
      T
      array(['1999-12-31T16:20:00.000000000', '1999-12-31T16:40:00.000000000',
             '1999-12-31T17:00:00.000000000', '1999-12-31T17:20:00.000000000',
             '1999-12-31T17:40:00.000000000', '1999-12-31T18:00:00.000000000',
             '1999-12-31T18:20:00.000000000', '1999-12-31T18:40:00.000000000',
             '1999-12-31T19:00:00.000000000', '1999-12-31T19:20:00.000000000',
             '1999-12-31T19:40:00.000000000', '1999-12-31T20:00:00.000000000',
             '1999-12-31T20:20:00.000000000', '1999-12-31T20:40:00.000000000',
             '1999-12-31T21:00:00.000000000', '1999-12-31T21:20:00.000000000',
             '1999-12-31T21:40:00.000000000', '1999-12-31T22:00:00.000000000',
             '1999-12-31T22:20:00.000000000', '1999-12-31T22:40:00.000000000',
             '1999-12-31T23:00:00.000000000', '1999-12-31T23:20:00.000000000',
             '1999-12-31T23:40:00.000000000', '2000-01-01T00:00:00.000000000',
             '2000-01-01T00:20:00.000000000', '2000-01-01T00:40:00.000000000',
             '2000-01-01T01:00:00.000000000', '2000-01-01T01:20:00.000000000',
             '2000-01-01T01:40:00.000000000', '2000-01-01T02:00:00.000000000',
             '2000-01-01T02:20:00.000000000', '2000-01-01T02:40:00.000000000',
             '2000-01-01T03:00:00.000000000', '2000-01-01T03:20:00.000000000',
             '2000-01-01T03:40:00.000000000', '2000-01-01T04:00:00.000000000',
             '2000-01-01T04:20:00.000000000', '2000-01-01T04:40:00.000000000',
             '2000-01-01T05:00:00.000000000', '2000-01-01T05:20:00.000000000',
             '2000-01-01T05:40:00.000000000', '2000-01-01T06:00:00.000000000',
             '2000-01-01T06:20:00.000000000', '2000-01-01T06:40:00.000000000',
             '2000-01-01T07:00:00.000000000', '2000-01-01T07:20:00.000000000',
             '2000-01-01T07:40:00.000000000', '2000-01-01T08:00:00.000000000',
             '2000-01-01T08:20:00.000000000', '2000-01-01T08:40:00.000000000',
             '2000-01-01T09:00:00.000000000', '2000-01-01T09:20:00.000000000',
             '2000-01-01T09:40:00.000000000', '2000-01-01T10:00:00.000000000',
             '2000-01-01T10:20:00.000000000', '2000-01-01T10:40:00.000000000',
             '2000-01-01T11:00:00.000000000', '2000-01-01T11:20:00.000000000',
             '2000-01-01T11:40:00.000000000', '2000-01-01T12:00:00.000000000',
             '2000-01-01T12:20:00.000000000', '2000-01-01T12:40:00.000000000',
             '2000-01-01T13:00:00.000000000', '2000-01-01T13:20:00.000000000',
             '2000-01-01T13:40:00.000000000', '2000-01-01T14:00:00.000000000',
             '2000-01-01T14:20:00.000000000', '2000-01-01T14:40:00.000000000',
             '2000-01-01T15:00:00.000000000', '2000-01-01T15:20:00.000000000',
             '2000-01-01T15:40:00.000000000', '2000-01-01T16:00:00.000000000',
             '2000-01-01T16:20:00.000000000', '2000-01-01T16:40:00.000000000',
             '2000-01-01T17:00:00.000000000', '2000-01-01T17:20:00.000000000',
             '2000-01-01T17:40:00.000000000', '2000-01-01T18:00:00.000000000',
             '2000-01-01T18:20:00.000000000', '2000-01-01T18:40:00.000000000',
             '2000-01-01T19:00:00.000000000', '2000-01-01T19:20:00.000000000',
             '2000-01-01T19:40:00.000000000', '2000-01-01T20:00:00.000000000',
             '2000-01-01T20:20:00.000000000', '2000-01-01T20:40:00.000000000',
             '2000-01-01T21:00:00.000000000', '2000-01-01T21:20:00.000000000',
             '2000-01-01T21:40:00.000000000', '2000-01-01T22:00:00.000000000',
             '2000-01-01T22:20:00.000000000', '2000-01-01T22:40:00.000000000',
             '2000-01-01T23:00:00.000000000', '2000-01-01T23:20:00.000000000',
             '2000-01-01T23:40:00.000000000', '2000-01-02T00:00:00.000000000',
             '2000-01-02T00:20:00.000000000', '2000-01-02T00:40:00.000000000',
             '2000-01-02T01:00:00.000000000', '2000-01-02T01:20:00.000000000',
             '2000-01-02T01:40:00.000000000', '2000-01-02T02:00:00.000000000',
             '2000-01-02T02:20:00.000000000', '2000-01-02T02:40:00.000000000',
             '2000-01-02T03:00:00.000000000', '2000-01-02T03:20:00.000000000',
             '2000-01-02T03:40:00.000000000', '2000-01-02T04:00:00.000000000',
             '2000-01-02T04:20:00.000000000', '2000-01-02T04:40:00.000000000',
             '2000-01-02T05:00:00.000000000', '2000-01-02T05:20:00.000000000',
             '2000-01-02T05:40:00.000000000', '2000-01-02T06:00:00.000000000',
             '2000-01-02T06:20:00.000000000', '2000-01-02T06:40:00.000000000',
             '2000-01-02T07:00:00.000000000', '2000-01-02T07:20:00.000000000',
             '2000-01-02T07:40:00.000000000', '2000-01-02T08:00:00.000000000',
             '2000-01-02T08:20:00.000000000', '2000-01-02T08:40:00.000000000',
             '2000-01-02T09:00:00.000000000', '2000-01-02T09:20:00.000000000',
             '2000-01-02T09:40:00.000000000', '2000-01-02T10:00:00.000000000',
             '2000-01-02T10:20:00.000000000', '2000-01-02T10:40:00.000000000',
             '2000-01-02T11:00:00.000000000', '2000-01-02T11:20:00.000000000',
             '2000-01-02T11:40:00.000000000', '2000-01-02T12:00:00.000000000',
             '2000-01-02T12:20:00.000000000', '2000-01-02T12:40:00.000000000',
             '2000-01-02T13:00:00.000000000', '2000-01-02T13:20:00.000000000',
             '2000-01-02T13:40:00.000000000', '2000-01-02T14:00:00.000000000',
             '2000-01-02T14:20:00.000000000', '2000-01-02T14:40:00.000000000',
             '2000-01-02T15:00:00.000000000', '2000-01-02T15:20:00.000000000',
             '2000-01-02T15:40:00.000000000', '2000-01-02T16:00:00.000000000'],
            dtype='datetime64[ns]')
    • SCHISM_hgrid_node_x
      (nSCHISM_hgrid_node)
      float64
      dask.array<chunksize=(2639,), meta=np.ndarray>
      axis :
      X
      location :
      node
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_x_coordinate
      Array Chunk
      Bytes 20.62 kiB 20.62 kiB
      Shape (2639,) (2639,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      2639 1
    • SCHISM_hgrid_node_y
      (nSCHISM_hgrid_node)
      float64
      dask.array<chunksize=(2639,), meta=np.ndarray>
      axis :
      Y
      location :
      node
      mesh :
      SCHISM_hgrid
      units :
      m
      standard_name :
      projection_y_coordinate
      Array Chunk
      Bytes 20.62 kiB 20.62 kiB
      Shape (2639,) (2639,)
      Dask graph 1 chunks in 2 graph layers
      Data type float64 numpy.ndarray
      2639 1
    • mag
      (time, nSCHISM_hgrid_node)
      float32
      dask.array<chunksize=(72, 2639), meta=np.ndarray>
      Array Chunk
      Bytes 1.45 MiB 742.22 kiB
      Shape (144, 2639) (72, 2639)
      Dask graph 2 chunks in 14 graph layers
      Data type float32 numpy.ndarray
      2639 144
    • angle
      (time, nSCHISM_hgrid_node)
      float32
      dask.array<chunksize=(72, 2639), meta=np.ndarray>
      i23d :
      1
      location :
      node
      grid_mapping :
      crs
      mesh :
      SCHISM_hgrid
      Array Chunk
      Bytes 1.45 MiB 742.22 kiB
      Shape (144, 2639) (72, 2639)
      Dask graph 2 chunks in 11 graph layers
      Data type float32 numpy.ndarray
      2639 144
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['1999-12-31 16:20:00', '1999-12-31 16:40:00',
                     '1999-12-31 17:00:00', '1999-12-31 17:20:00',
                     '1999-12-31 17:40:00', '1999-12-31 18:00:00',
                     '1999-12-31 18:20:00', '1999-12-31 18:40:00',
                     '1999-12-31 19:00:00', '1999-12-31 19:20:00',
                     ...
                     '2000-01-02 13:00:00', '2000-01-02 13:20:00',
                     '2000-01-02 13:40:00', '2000-01-02 14:00:00',
                     '2000-01-02 14:20:00', '2000-01-02 14:40:00',
                     '2000-01-02 15:00:00', '2000-01-02 15:20:00',
                     '2000-01-02 15:40:00', '2000-01-02 16:00:00'],
                    dtype='datetime64[ns]', name='time', length=144, freq=None))

Map of velocity vectors¶

In [14]:
def velocity_field(time, vector_size=1):
    data = vel.isel(time=time)
    vf = hv.VectorField((vel.coords['SCHISM_hgrid_node_x'],vel.coords['SCHISM_hgrid_node_y'],data.angle, data.mag))
    vf.opts(opts.VectorField(pivot='tip', color=dim('Magnitude'), magnitude=dim('Magnitude').norm()*2000*vector_size, rescale_lengths=False))
    return vf.opts(width=600)
In [15]:
velocity_field(70,1)
Out[15]:

DynamicMap of salinity colors¶

In [16]:
def salinity_mesh(time, level):
    trimesh.nodes.data[varname] = ds[varname].isel(time=time, nSCHISM_vgrid_layers=level)
    return rasterize(trimesh, precompute=False, dynamic=False, 
                        aggregator=datashader.mean(varname)).opts(
            colorbar=True, cmap='rainbow4', width=600, height=300, tools=['hover'])
In [17]:
salinity_mesh(0,0)
Out[17]:

Overlay the salinity mesh with the velocity field¶

In [18]:
def update(time, level):
    return salinity_mesh(time,level).opts(width=1000, height=500)*velocity_field(time, 1)

Add widgets and show in a separate dashboard¶

In [19]:
import panel as pn
pn.extension()
In [20]:
time_slider = pn.widgets.DiscreteSlider(name='Time',
                                       options=dict(zip(ds.time.astype('str').values,
                                                        range(len(ds.time)))))
level_selector = pn.widgets.Select(name='nSCHISM_vgrid_layers',
                                options=dict(zip(ds.nSCHISM_vgrid_layers.astype('str').values, 
                                                 range(len(ds.nSCHISM_vgrid_layers)))))
In [21]:
slider_row = pn.Row(time_slider, level_selector)
In [22]:
map_row = pn.Row(hv.DynamicMap(update,streams={'time':time_slider, 'level': level_selector}))
In [23]:
dash = pn.Column(slider_row, map_row)
In [24]:
dash.servable(f'HelloSCHISM: {varname}')#.show()
Out[24]: